home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 January / PCWorld_2007-01_cd.bin / v cisle / autoit / autoit-v3.2.0.1-setup.exe / Include / Date.au3 < prev    next >
Text File  |  2006-07-14  |  59KB  |  1,540 lines

  1. ; Include Version:1.65 (6 July 2006)
  2. #include-once
  3. ;
  4. ; ------------------------------------------------------------------------------
  5. ;
  6. ; AutoIt Version: 3.0
  7. ; Language:       English
  8. ; Description:    Functions that assist with dates and times.
  9. ;
  10. ;===============================================================================
  11. ;
  12. ; Description:      Calculates a new date based on a given date and add an interval.
  13. ; Parameter(s):     $sType    D = Add number of days to the given date
  14. ;                             M = Add number of months to the given date
  15. ;                             Y = Add number of years to the given date
  16. ;                             w = Add number of Weeks to the given date
  17. ;                             h = Add number of hours to the given date
  18. ;                             n = Add number of minutes to the given date
  19. ;                             s = Add number of seconds to the given date
  20. ;                   $iValToAdd - number to be added
  21. ;                   $sDate    - Input date in the format YYYY/MM/DD[ HH:MM:SS]
  22. ; Requirement(s):   None
  23. ; Return Value(s):  On Success - Date newly calculated date.
  24. ;                   On Failure - 0  and Set
  25. ;                                   @ERROR to:  1 - Invalid $sType
  26. ;                                                  2 - Invalid $iValToAdd
  27. ;                                                  3 - Invalid $sDate
  28. ; Author(s):        Jos van der Zande
  29. ; Note(s):          The function will not return an invalid date.
  30. ;                   When 3 months is are to '2004/1/31' then the result will be 2004/04/30
  31. ;
  32. ;
  33. ;===============================================================================
  34. Func _DateAdd($sType, $iValToAdd, $sDate)
  35.     Local $asTimePart[4]
  36.     Local $asDatePart[4]
  37.     Local $iJulianDate
  38.     Local $iTimeVal
  39.     Local $iNumDays
  40.     Local $Day2Add
  41.     ; Verify that $sType is Valid
  42.     $sType = StringLeft($sType, 1)
  43.     If StringInStr("D,M,Y,w,h,n,s", $sType) = 0 Or $sType = "" Then
  44.         SetError(1)
  45.         Return (0)
  46.     EndIf
  47.     ; Verify that Value to Add  is Valid
  48.     If Not StringIsInt($iValToAdd) Then
  49.         SetError(2)
  50.         Return (0)
  51.     EndIf
  52.     ; Verify If InputDate is valid
  53.     If Not _DateIsValid($sDate) Then
  54.         SetError(3)
  55.         Return (0)
  56.     EndIf
  57.     ; split the date and time into arrays
  58.     _DateTimeSplit($sDate, $asDatePart, $asTimePart)
  59.     
  60.     ; ====================================================
  61.     ; adding days then get the julian date
  62.     ; add the number of day
  63.     ; and convert back to Gregorian
  64.     If $sType = "d" Or $sType = "w" Then
  65.         If $sType = "w" Then $iValToAdd = $iValToAdd * 7
  66.         $iJulianDate = _DateToDayValue($asDatePart[1], $asDatePart[2], $asDatePart[3]) + $iValToAdd
  67.         _DayValueToDate($iJulianDate, $asDatePart[1], $asDatePart[2], $asDatePart[3])
  68.     EndIf
  69.     ; ====================================================
  70.     ; adding Months
  71.     If $sType = "m" Then
  72.         $asDatePart[2] = $asDatePart[2] + $iValToAdd
  73.         ; pos number of months
  74.         While $asDatePart[2] > 12
  75.             $asDatePart[2] = $asDatePart[2] - 12
  76.             $asDatePart[1] = $asDatePart[1] + 1
  77.         WEnd
  78.         ; Neg number of months
  79.         While $asDatePart[2] < 1
  80.             $asDatePart[2] = $asDatePart[2] + 12
  81.             $asDatePart[1] = $asDatePart[1] - 1
  82.         WEnd
  83.     EndIf
  84.     ; ====================================================
  85.     ; adding Years
  86.     If $sType = "y" Then
  87.         $asDatePart[1] = $asDatePart[1] + $iValToAdd
  88.     EndIf
  89.     ; ====================================================
  90.     ; adding Time value
  91.     If $sType = "h" Or $sType = "n" Or $sType = "s" Then
  92.         $iTimeVal = _TimeToTicks($asTimePart[1], $asTimePart[2], $asTimePart[3]) / 1000
  93.         If $sType = "h" Then $iTimeVal = $iTimeVal + $iValToAdd * 3600
  94.         If $sType = "n" Then $iTimeVal = $iTimeVal + $iValToAdd * 60
  95.         If $sType = "s" Then $iTimeVal = $iTimeVal + $iValToAdd
  96.         ; calculated days to add
  97.         $Day2Add = Int($iTimeVal/ (24 * 60 * 60))
  98.         $iTimeVal = $iTimeVal - $Day2Add * 24 * 60 * 60
  99.         If $iTimeVal < 0 Then
  100.             $Day2Add = $Day2Add - 1
  101.             $iTimeVal = $iTimeVal + 24 * 60 * 60
  102.         EndIf
  103.         $iJulianDate = _DateToDayValue($asDatePart[1], $asDatePart[2], $asDatePart[3]) + $Day2Add
  104.         ; calculate the julian back to date
  105.         _DayValueToDate($iJulianDate, $asDatePart[1], $asDatePart[2], $asDatePart[3])
  106.         ; caluculate the new time
  107.         _TicksToTime($iTimeVal * 1000, $asTimePart[1], $asTimePart[2], $asTimePart[3])
  108.     EndIf
  109.     ; ====================================================
  110.     ; check if the Input day is Greater then the new month last day.
  111.     ; if so then change it to the last possible day in the month
  112.     $iNumDays = StringSplit('31,28,31,30,31,30,31,31,30,31,30,31', ',')
  113.     If _DateIsLeapYear($asDatePart[1]) Then $iNumDays[2] = 29
  114.     ;
  115.     If $iNumDays[$asDatePart[2]] < $asDatePart[3] Then $asDatePart[3] = $iNumDays[$asDatePart[2]]
  116.     ; ========================
  117.     ; Format the return date
  118.     ; ========================
  119.     ; Format the return date
  120.     $sDate = $asDatePart[1] & '/' & StringRight("0" & $asDatePart[2], 2) & '/' & StringRight("0" & $asDatePart[3], 2)
  121.     ; add the time when specified in the input
  122.     If $asTimePart[0] > 0 Then
  123.         If $asTimePart[0] > 2 Then
  124.             $sDate = $sDate & " " & StringRight("0" & $asTimePart[1], 2) & ':' & StringRight("0" & $asTimePart[2], 2) & ':' & StringRight("0" & $asTimePart[3], 2)
  125.         Else
  126.             $sDate = $sDate & " " & StringRight("0" & $asTimePart[1], 2) & ':' & StringRight("0" & $asTimePart[2], 2)
  127.         EndIf
  128.     EndIf
  129.     ;
  130.     return ($sDate)
  131. EndFunc   ;==>_DateAdd
  132.  
  133. ;===============================================================================
  134. ;
  135. ; Description:      Returns the name of the weekday, based on the specified day.
  136. ; Parameter(s):     $iDayNum - Day number
  137. ;                   $iShort  - Format:
  138. ;                              0 = Long name of the weekday
  139. ;                              1 = Abbreviated name of the weekday
  140. ; Requirement(s):   None
  141. ; Return Value(s):  On Success - Weekday name
  142. ;                   On Failure - A NULL string and sets @ERROR = 1
  143. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  144. ; Note(s):          English only
  145. ;
  146. ;===============================================================================
  147. Func _DateDayOfWeek($iDayNum, $iShort = 0)
  148.     ;==============================================
  149.     ; Local Constant/Variable Declaration Section
  150.     ;==============================================
  151.     Local $aDayOfWeek[8]
  152.     
  153.     $aDayOfWeek[1] = "Sunday"
  154.     $aDayOfWeek[2] = "Monday"
  155.     $aDayOfWeek[3] = "Tuesday"
  156.     $aDayOfWeek[4] = "Wednesday"
  157.     $aDayOfWeek[5] = "Thursday"
  158.     $aDayOfWeek[6] = "Friday"
  159.     $aDayOfWeek[7] = "Saturday"
  160.     Select
  161.         Case Not StringIsInt($iDayNum) Or Not StringIsInt($iShort)
  162.             SetError(1)
  163.             Return ""
  164.         Case $iDayNum < 1 Or $iDayNum > 7
  165.             SetError(1)
  166.             Return ""
  167.         Case Else
  168.             Select
  169.                 Case $iShort = 0
  170.                     Return $aDayOfWeek[$iDayNum]
  171.                 Case $iShort = 1
  172.                     Return StringLeft($aDayOfWeek[$iDayNum], 3)
  173.                 Case Else
  174.                     SetError(1)
  175.                     Return ""
  176.             EndSelect
  177.     EndSelect
  178. EndFunc   ;==>_DateDayOfWeek
  179.  
  180. ;===============================================================================
  181. ;
  182. ; Function Name:  _DateDaysInMonth()
  183. ; Description:    Returns the number of days in a month, based on the specified
  184. ;                 month and year.
  185. ; Author(s):      Jeremy Landes <jlandes at landeserve dot com>
  186. ;
  187. ;===============================================================================
  188. Func _DateDaysInMonth($iYear, $iMonthNum)
  189.     Local $aiNumDays
  190.     $aiNumDays = "31,28,31,30,31,30,31,31,30,31,30,31"
  191.     $aiNumDays = StringSplit($aiNumDays, ",")
  192.     If _DateIsMonth($iMonthNum) And _DateIsYear($iYear) Then
  193.         If _DateIsLeapYear($iYear) Then $aiNumDays[2] = $aiNumDays[2] + 1
  194.         SetError(0)
  195.         Return $aiNumDays[$iMonthNum]
  196.     Else
  197.         SetError(1)
  198.         Return 0
  199.     EndIf
  200. EndFunc   ;==>_DateDaysInMonth
  201.  
  202. ;===============================================================================
  203. ;
  204. ; Description:      Returns the difference between 2 dates, expressed in the type requested
  205. ; Parameter(s):     $sType - returns the difference in:
  206. ;                               d = days
  207. ;                               m = Months
  208. ;                               y = Years
  209. ;                               w = Weeks
  210. ;                               h = Hours
  211. ;                               n = Minutes
  212. ;                               s = Seconds
  213. ;                   $sStartDate    - Input Start date in the format "YYYY/MM/DD[ HH:MM:SS]"
  214. ;                   $sEndDate    - Input End date in the format "YYYY/MM/DD[ HH:MM:SS]"
  215. ; Requirement(s):   None
  216. ; Return Value(s):  On Success - Difference between the 2 dates
  217. ;                   On Failure - 0  and Set
  218. ;                                   @ERROR to:  1 - Invalid $sType
  219. ;                                               2 - Invalid $sStartDate
  220. ;                                               3 - Invalid $sEndDate
  221. ; Author(s):        Jos van der Zande
  222. ; Note(s):
  223. ;
  224. ;===============================================================================
  225. Func _DateDiff($sType, $sStartDate, $sEndDate)
  226.     Local $asStartDatePart[4]
  227.     Local $asStartTimePart[4]
  228.     Local $asEndDatePart[4]
  229.     Local $asEndTimePart[4]
  230.     Local $iTimeDiff
  231.     Local $iYearDiff
  232.     Local $iMonthDiff
  233.     Local $iStartTimeInSecs
  234.     Local $iEndTimeInSecs
  235.     Local $aDaysDiff
  236.     ;
  237.     ; Verify that $sType is Valid
  238.     $sType = StringLeft($sType, 1)
  239.     If StringInStr("d,m,y,w,h,n,s", $sType) = 0 Or $sType = "" Then
  240.         SetError(1)
  241.         Return (0)
  242.     EndIf
  243.     ; Verify If StartDate is valid
  244.     If Not _DateIsValid($sStartDate) Then
  245.         SetError(2)
  246.         Return (0)
  247.     EndIf
  248.     ; Verify If EndDate is valid
  249.     If Not _DateIsValid($sEndDate) Then
  250.         SetError(3)
  251.         Return (0)
  252.     EndIf
  253.     ; split the StartDate and Time into arrays
  254.     _DateTimeSplit($sStartDate, $asStartDatePart, $asStartTimePart)
  255.     ; split the End  Date and time into arrays
  256.     _DateTimeSplit($sEndDate, $asEndDatePart, $asEndTimePart)
  257.     ; ====================================================
  258.     ; Get the differens in days between the 2 dates
  259.     $aDaysDiff = _DateToDayValue($asEndDatePart[1], $asEndDatePart[2], $asEndDatePart[3]) - _DateToDayValue($asStartDatePart[1], $asStartDatePart[2], $asStartDatePart[3])
  260.     ; ====================================================
  261.     ; Get the differens in Seconds between the 2 times when specified
  262.     If $asStartTimePart[0] > 1 And $asEndTimePart[0] > 1 Then
  263.         $iStartTimeInSecs = $asStartTimePart[1] * 3600 + $asStartTimePart[2] * 60 + $asStartTimePart[3]
  264.         $iEndTimeInSecs = $asEndTimePart[1] * 3600 + $asEndTimePart[2] * 60 + $asEndTimePart[3]
  265.         $iTimeDiff = $iEndTimeInSecs - $iStartTimeInSecs
  266.         If $iTimeDiff < 0 Then
  267.             $aDaysDiff = $aDaysDiff - 1
  268.             $iTimeDiff = $iTimeDiff + 24 * 60 * 60
  269.         EndIf
  270.     Else
  271.         $iTimeDiff = 0
  272.     EndIf
  273.     Select
  274.         Case $sType = "d"
  275.             Return ($aDaysDiff)
  276.         Case $sType = "m"
  277.             $iYearDiff = $asEndDatePart[1] - $asStartDatePart[1]
  278.             $iMonthDiff = $asEndDatePart[2] - $asStartDatePart[2] + $iYearDiff * 12
  279.             If $asEndDatePart[3] < $asStartDatePart[3] Then $iMonthDiff = $iMonthDiff - 1
  280.             $iStartTimeInSecs = $asStartTimePart[1] * 3600 + $asStartTimePart[2] * 60 + $asStartTimePart[3]
  281.             $iEndTimeInSecs = $asEndTimePart[1] * 3600 + $asEndTimePart[2] * 60 + $asEndTimePart[3]
  282.             $iTimeDiff = $iEndTimeInSecs - $iStartTimeInSecs
  283.             If $asEndDatePart[3] = $asStartDatePart[3] And $iTimeDiff < 0 Then $iMonthDiff = $iMonthDiff - 1
  284.             Return ($iMonthDiff)
  285.         Case $sType = "y"
  286.             $iYearDiff = $asEndDatePart[1] - $asStartDatePart[1]
  287.             If $asEndDatePart[2] < $asStartDatePart[2] Then $iYearDiff = $iYearDiff - 1
  288.             If $asEndDatePart[2] = $asStartDatePart[2] And $asEndDatePart[3] < $asStartDatePart[3] Then $iYearDiff = $iYearDiff - 1
  289.             $iStartTimeInSecs = $asStartTimePart[1] * 3600 + $asStartTimePart[2] * 60 + $asStartTimePart[3]
  290.             $iEndTimeInSecs = $asEndTimePart[1] * 3600 + $asEndTimePart[2] * 60 + $asEndTimePart[3]
  291.             $iTimeDiff = $iEndTimeInSecs - $iStartTimeInSecs
  292.             If $asEndDatePart[2] = $asStartDatePart[2] And $asEndDatePart[3] = $asStartDatePart[3] And $iTimeDiff < 0 Then $iYearDiff = $iYearDiff - 1
  293.             Return ($iYearDiff)
  294.         Case $sType = "w"
  295.             Return (Int($aDaysDiff / 7))
  296.         Case $sType = "h"
  297.             Return ($aDaysDiff * 24 + Int($iTimeDiff / 3600))
  298.         Case $sType = "n"
  299.             Return ($aDaysDiff * 24 * 60 + Int($iTimeDiff / 60))
  300.         Case $sType = "s"
  301.             Return ($aDaysDiff * 24 * 60 * 60 + $iTimeDiff)
  302.     EndSelect
  303. EndFunc   ;==>_DateDiff
  304.  
  305. ;===============================================================================
  306. ;
  307. ; Description:      Returns 1 if the specified year falls on a leap year and
  308. ;                   returns 0 if it does not.
  309. ; Parameter(s):     $iYear - Year to check
  310. ; Requirement(s):   None
  311. ; Return Value(s):  On Success - 0 = Year is not a leap year
  312. ;                                1 = Year is a leap year
  313. ;                   On Failure - 0 and sets @ERROR = 1
  314. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  315. ; Note(s):          None
  316. ;
  317. ;===============================================================================
  318. Func _DateIsLeapYear($iYear)
  319.     If StringIsInt($iYear) Then
  320.         Select
  321.             Case Mod($iYear, 4) = 0 And Mod($iYear, 100) <> 0
  322.                 Return 1
  323.             Case Mod($iYear, 400) = 0
  324.                 Return 1
  325.             Case Else
  326.                 Return 0
  327.         EndSelect
  328.     Else
  329.         SetError(1)
  330.         Return 0
  331.     EndIf
  332. EndFunc   ;==>_DateIsLeapYear
  333.  
  334. ;===============================================================================
  335. ;
  336. ; Function Name:  _DateIsMonth()
  337. ; Description:    Checks a given number to see if it is a valid month.
  338. ; Author(s):      Jeremy Landes <jlandes at landeserve dot com>
  339. ;
  340. ;===============================================================================
  341. Func _DateIsMonth($iNumber)
  342.     If StringIsInt($iNumber) Then
  343.         If $iNumber >= 1 And $iNumber <= 12 Then
  344.             Return 1
  345.         Else
  346.             Return 0
  347.         EndIf
  348.     Else
  349.         Return 0
  350.     EndIf
  351. EndFunc   ;==>_DateIsMonth
  352.  
  353. ;===============================================================================
  354. ;
  355. ; Description:      Verify if date and time are valid "yyyy/mm/dd[ hh:mm[:ss]]".
  356. ; Parameter(s):     $sDate format "yyyy/mm/dd[ hh:mm[:ss]]"
  357. ; Requirement(s):   None
  358. ; Return Value(s):  On Success - 1
  359. ;                   On Failure - 0
  360. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  361. ;                   Jos van der Zande <jdeb at autoitscript dot com>
  362. ; Note(s):          None
  363. ;
  364. ;===============================================================================
  365. Func _DateIsValid($sDate)
  366.     Local $asDatePart[4]
  367.     Local $asTimePart[4]
  368.     Local $iNumDays
  369.     $iNumDays = "31,28,31,30,31,30,31,31,30,31,30,31"
  370.     $iNumDays = StringSplit($iNumDays, ",")
  371.     ; split the date and time into arrays
  372.     _DateTimeSplit($sDate, $asDatePart, $asTimePart)
  373.     If $asDatePart[0] <> 3 Then
  374.         Return (0)
  375.     EndIf
  376.     ; verify valid input date values
  377.     If _DateIsLeapYear($asDatePart[1]) Then $iNumDays[2] = 29
  378.     If $asDatePart[1] < 1000 Or $asDatePart[1] > 2999 Then Return (0)
  379.     If $asDatePart[2] < 1 Or $asDatePart[2] > 12 Then Return (0)
  380.     If $asDatePart[3] < 1 Or $asDatePart[3] > $iNumDays[$asDatePart[2]] Then Return (0)
  381.     
  382.     ; verify valid input Time values
  383.     If $asTimePart[0] < 1 Then Return (1)    ; No time specified so date must be correct
  384.     If $asTimePart[0] < 2 Then Return (0)    ; need at least HH:MM when something is specified
  385.     If $asTimePart[1] < 0 Or $asTimePart[1] > 23 Then Return (0)
  386.     If $asTimePart[2] < 0 Or $asTimePart[2] > 59 Then Return (0)
  387.     If $asTimePart[3] < 0 Or $asTimePart[3] > 59 Then Return (0)
  388.     ; we got here so date/time must be good
  389.     Return (1)
  390. EndFunc   ;==>_DateIsValid
  391.  
  392. ;===============================================================================
  393. ;
  394. ; Function Name:  _DateIsYear()
  395. ; Description:    Checks a given number to see if it is a valid year.
  396. ; Author(s):      Jeremy Landes <jlandes at landeserve dot com>
  397. ;
  398. ;===============================================================================
  399. Func _DateIsYear($iNumber)
  400.     If StringIsInt($iNumber) Then
  401.         If StringLen($iNumber) = 4 Then
  402.             Return 1
  403.         Else
  404.             Return 0
  405.         EndIf
  406.     Else
  407.         Return 0
  408.     EndIf
  409. EndFunc   ;==>_DateIsYear
  410.  
  411. ;===============================================================================
  412. ;
  413. ; Description:      Returns previous weekday number, based on the specified day
  414. ;                   of the week.
  415. ; Parameter(s):     $iWeekdayNum - Weekday number
  416. ; Requirement(s):   None
  417. ; Return Value(s):  On Success - Previous weekday number
  418. ;                   On Failure - 0 and sets @ERROR = 1
  419. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  420. ; Note(s):          None
  421. ;
  422. ;===============================================================================
  423. Func _DateLastWeekdayNum($iWeekdayNum)
  424.     ;==============================================
  425.     ; Local Constant/Variable Declaration Section
  426.     ;==============================================
  427.     Local $iLastWeekdayNum
  428.     
  429.     Select
  430.         Case Not StringIsInt($iWeekdayNum)
  431.             SetError(1)
  432.             Return 0
  433.         Case $iWeekdayNum < 1 Or $iWeekdayNum > 7
  434.             SetError(1)
  435.             Return 0
  436.         Case Else
  437.             If $iWeekdayNum = 1 Then
  438.                 $iLastWeekdayNum = 7
  439.             Else
  440.                 $iLastWeekdayNum = $iWeekdayNum - 1
  441.             EndIf
  442.             
  443.             Return $iLastWeekdayNum
  444.     EndSelect
  445. EndFunc   ;==>_DateLastWeekdayNum
  446.  
  447. ;===============================================================================
  448. ;
  449. ; Description:      Returns previous month number, based on the specified month.
  450. ; Parameter(s):     $iMonthNum - Month number
  451. ; Requirement(s):   None
  452. ; Return Value(s):  On Success - Previous month number
  453. ;                   On Failure - 0 and sets @ERROR = 1
  454. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  455. ; Note(s):          None
  456. ;
  457. ;===============================================================================
  458. Func _DateLastMonthNum($iMonthNum)
  459.     ;==============================================
  460.     ; Local Constant/Variable Declaration Section
  461.     ;==============================================
  462.     Local $iLastMonthNum
  463.     
  464.     Select
  465.         Case Not StringIsInt($iMonthNum)
  466.             SetError(1)
  467.             Return 0
  468.         Case $iMonthNum < 1 Or $iMonthNum > 12
  469.             SetError(1)
  470.             Return 0
  471.         Case Else
  472.             If $iMonthNum = 1 Then
  473.                 $iLastMonthNum = 12
  474.             Else
  475.                 $iLastMonthNum = $iMonthNum - 1
  476.             EndIf
  477.             
  478.             $iLastMonthNum = StringFormat( "%02d", $iLastMonthNum)
  479.             Return $iLastMonthNum
  480.     EndSelect
  481. EndFunc   ;==>_DateLastMonthNum
  482.  
  483. ;===============================================================================
  484. ;
  485. ; Description:      Returns previous month's year, based on the specified month
  486. ;                   and year.
  487. ; Parameter(s):     $iMonthNum - Month number
  488. ;                   $iYear     - Year
  489. ; Requirement(s):   None
  490. ; Return Value(s):  On Success - Previous month's year
  491. ;                   On Failure - 0 and sets @ERROR = 1
  492. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  493. ; Note(s):          None
  494. ;
  495. ;===============================================================================
  496. Func _DateLastMonthYear($iMonthNum, $iYear)
  497.     ;==============================================
  498.     ; Local Constant/Variable Declaration Section
  499.     ;==============================================
  500.     Local $iLastYear
  501.     
  502.     Select
  503.         Case Not StringIsInt($iMonthNum) Or Not StringIsInt($iYear)
  504.             SetError(1)
  505.             Return 0
  506.         Case $iMonthNum < 1 Or $iMonthNum > 12
  507.             SetError(1)
  508.             Return 0
  509.         Case Else
  510.             If $iMonthNum = 1 Then
  511.                 $iLastYear = $iYear - 1
  512.             Else
  513.                 $iLastYear = $iYear
  514.             EndIf
  515.             
  516.             $iLastYear = StringFormat( "%04d", $iLastYear)
  517.             Return $iLastYear
  518.     EndSelect
  519. EndFunc   ;==>_DateLastMonthYear
  520.  
  521. ;===============================================================================
  522. ;
  523. ; Description:      Returns the name of the month, based on the specified month.
  524. ; Parameter(s):     $iMonthNum - Month number
  525. ;                   $iShort    - Format:
  526. ;                                0 = Long name of the month
  527. ;                                1 = Abbreviated name of the month
  528. ; Requirement(s):   None
  529. ; Return Value(s):  On Success - Month name
  530. ;                   On Failure - A NULL string and sets @ERROR = 1
  531. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  532. ; Note(s):          English only
  533. ;
  534. ;===============================================================================
  535. Func _DateMonthOfYear($iMonthNum, $iShort)
  536.     ;==============================================
  537.     ; Local Constant/Variable Declaration Section
  538.     ;==============================================
  539.     Local $aMonthOfYear[13]
  540.     
  541.     $aMonthOfYear[1] = "January"
  542.     $aMonthOfYear[2] = "February"
  543.     $aMonthOfYear[3] = "March"
  544.     $aMonthOfYear[4] = "April"
  545.     $aMonthOfYear[5] = "May"
  546.     $aMonthOfYear[6] = "June"
  547.     $aMonthOfYear[7] = "July"
  548.     $aMonthOfYear[8] = "August"
  549.     $aMonthOfYear[9] = "September"
  550.     $aMonthOfYear[10] = "October"
  551.     $aMonthOfYear[11] = "November"
  552.     $aMonthOfYear[12] = "December"
  553.     
  554.     Select
  555.         Case Not StringIsInt($iMonthNum) Or Not StringIsInt($iShort)
  556.             SetError(1)
  557.             Return ""
  558.         Case $iMonthNum < 1 Or $iMonthNum > 12
  559.             SetError(1)
  560.             Return ""
  561.         Case Else
  562.             Select
  563.                 Case $iShort = 0
  564.                     Return $aMonthOfYear[$iMonthNum]
  565.                 Case $iShort = 1
  566.                     Return StringLeft($aMonthOfYear[$iMonthNum], 3)
  567.                 Case Else
  568.                     SetError(1)
  569.                     Return ""
  570.             EndSelect
  571.     EndSelect
  572. EndFunc   ;==>_DateMonthOfYear
  573.  
  574. ;===============================================================================
  575. ;
  576. ; Description:      Returns next weekday number, based on the specified day of
  577. ;                   the week.
  578. ; Parameter(s):     $iWeekdayNum - Weekday number
  579. ; Requirement(s):   None
  580. ; Return Value(s):  On Success - Next weekday number
  581. ;                   On Failure - 0 and sets @ERROR = 1
  582. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  583. ; Note(s):          None
  584. ;
  585. ;===============================================================================
  586. Func _DateNextWeekdayNum($iWeekdayNum)
  587.     ;==============================================
  588.     ; Local Constant/Variable Declaration Section
  589.     ;==============================================
  590.     Local $iNextWeekdayNum
  591.     
  592.     Select
  593.         Case Not StringIsInt($iWeekdayNum)
  594.             SetError(1)
  595.             Return 0
  596.         Case $iWeekdayNum < 1 Or $iWeekdayNum > 7
  597.             SetError(1)
  598.             Return 0
  599.         Case Else
  600.             If $iWeekdayNum = 7 Then
  601.                 $iNextWeekdayNum = 1
  602.             Else
  603.                 $iNextWeekdayNum = $iWeekdayNum + 1
  604.             EndIf
  605.             
  606.             Return $iNextWeekdayNum
  607.     EndSelect
  608. EndFunc   ;==>_DateNextWeekdayNum
  609.  
  610. ;===============================================================================
  611. ;
  612. ; Description:      Returns next month number, based on the specified month.
  613. ; Parameter(s):     $iMonthNum - Month number
  614. ; Requirement(s):   None
  615. ; Return Value(s):  On Success - Next month number
  616. ;                   On Failure - 0 and sets @ERROR = 1
  617. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  618. ; Note(s):          None
  619. ;
  620. ;===============================================================================
  621. Func _DateNextMonthNum($iMonthNum)
  622.     ;==============================================
  623.     ; Local Constant/Variable Declaration Section
  624.     ;==============================================
  625.     Local $iNextMonthNum
  626.     
  627.     Select
  628.         Case Not StringIsInt($iMonthNum)
  629.             SetError(1)
  630.             Return 0
  631.         Case $iMonthNum < 1 Or $iMonthNum > 12
  632.             SetError(1)
  633.             Return 0
  634.         Case Else
  635.             If $iMonthNum = 12 Then
  636.                 $iNextMonthNum = 1
  637.             Else
  638.                 $iNextMonthNum = $iMonthNum + 1
  639.             EndIf
  640.             
  641.             $iNextMonthNum = StringFormat( "%02d", $iNextMonthNum)
  642.             Return $iNextMonthNum
  643.     EndSelect
  644. EndFunc   ;==>_DateNextMonthNum
  645.  
  646. ;===============================================================================
  647. ;
  648. ; Description:      Returns next month's year, based on the specified month and
  649. ;                   year.
  650. ; Parameter(s):     $iMonthNum - Month number
  651. ;                   $iYear     - Year
  652. ; Requirement(s):   None
  653. ; Return Value(s):  On Success - Next month's year
  654. ;                   On Failure - 0 and sets @ERROR = 1
  655. ; Author(s):        Jeremy Landes <jlandes at landeserve dot com>
  656. ; Note(s):          None
  657. ;
  658. ;===============================================================================
  659. Func _DateNextMonthYear($iMonthNum, $iYear)
  660.     ;==============================================
  661.     ; Local Constant/Variable Declaration Section
  662.     ;==============================================
  663.     Local $iNextYear
  664.     
  665.     Select
  666.         Case Not StringIsInt($iMonthNum) Or Not StringIsInt($iYear)
  667.             SetError(1)
  668.             Return 0
  669.         Case $iMonthNum < 1 Or $iMonthNum > 12
  670.             SetError(1)
  671.             Return 0
  672.         Case Else
  673.             If $iMonthNum = 12 Then
  674.                 $iNextYear = $iYear + 1
  675.             Else
  676.                 $iNextYear = $iYear
  677.             EndIf
  678.             
  679.             $iNextYear = StringFormat( "%04d", $iNextYear)
  680.             Return $iNextYear
  681.     EndSelect
  682. EndFunc   ;==>_DateNextMonthYear
  683.  
  684. ;===============================================================================
  685. ;
  686. ; Description:      Split Date and Time into two separateArrays.
  687. ; Parameter(s):     $sDate format "yyyy/mm/dd[ hh:mm[:ss]]"
  688. ;                    or    format "yyyy/mm/dd[Thh:mm[:ss]]"
  689. ;                    or    format "yyyy-mm-dd[ hh:mm[:ss]]"
  690. ;                    or    format "yyyy-mm-dd[Thh:mm[:ss]]"
  691. ;                    or    format "yyyy.mm.dd[ hh:mm[:ss]]"
  692. ;                    or    format "yyyy.mm.dd[Thh:mm[:ss]]"
  693. ;                   $asDatePart[4] array that contains the Date
  694. ;                   $iTimePart[4] array that contains the Time
  695. ; Requirement(s):   None
  696. ; Return Value(s):  Always 1
  697. ; Author(s):        Jos van der Zande
  698. ; Note(s):          Its expected you first do a _DateIsValid( $sDate ) for the input
  699. ;
  700. ;===============================================================================
  701. Func _DateTimeSplit($sDate, ByRef $asDatePart, ByRef $iTimePart)
  702.     Local $sDateTime
  703.     Local $x
  704.     ; split the Date and Time portion
  705.     $sDateTime = StringSplit($sDate, " T")
  706.     ; split the date portion
  707.     If $sDateTime[0] > 0 Then $asDatePart = StringSplit($sDateTime[1], "/-.")
  708.     ; split the Time portion
  709.     If $sDateTime[0] > 1 Then
  710.         $iTimePart = StringSplit($sDateTime[2], ":")
  711.         If UBound($iTimePart) < 4 Then ReDim $iTimePart[4]
  712.     Else
  713.         Dim $iTimePart[4]
  714.     EndIf
  715.     ; Ensure the arrays contain 4 values
  716.     If UBound($asDatePart) < 4 Then ReDim $asDatePart[4]
  717.     ; update the array to contain numbers not strings
  718.     For $x = 1 To 3
  719.         $asDatePart[$x] = Number($asDatePart[$x])
  720.         $iTimePart[$x] = Number($iTimePart[$x])
  721.     Next
  722.     Return (1)
  723. EndFunc   ;==>_DateTimeSplit
  724.  
  725. ;===============================================================================
  726. ;
  727. ; Description:      Returns the number of days since noon 4713 BC January 1.
  728. ; Parameter(s):     $Year  - Year in format YYYY
  729. ;                   $Month - Month in format MM
  730. ;                   $sDate - Day of the month format DD
  731. ; Requirement(s):   None
  732. ; Return Value(s):  On Success - Returns the Juliandate
  733. ;                   On Failure - 0  and sets @ERROR = 1
  734. ; Author(s):        Jos van der Zande / Jeremy Landes
  735. ; Note(s):          None
  736. ;
  737. ;===============================================================================
  738. Func _DateToDayValue($iYear, $iMonth, $iDay)
  739.     Local $i_aFactor
  740.     Local $i_bFactor
  741.     Local $i_cFactor
  742.     Local $i_eFactor
  743.     Local $i_fFactor
  744.     Local $iJulianDate
  745.     ; Verify If InputDate is valid
  746.     If Not _DateIsValid(StringFormat( "%04d/%02d/%02d", $iYear, $iMonth, $iDay)) Then
  747.         SetError(1)
  748.         Return ("")
  749.     EndIf
  750.     If $iMonth < 3 Then
  751.         $iMonth = $iMonth + 12
  752.         $iYear = $iYear - 1
  753.     EndIf
  754.     $i_aFactor = Int($iYear / 100)
  755.     $i_bFactor = Int($i_aFactor / 4)
  756.     $i_cFactor = 2 - $i_aFactor + $i_bFactor
  757.     $i_eFactor = Int(1461 * ($iYear + 4716) / 4)
  758.     $i_fFactor = Int(153 * ($iMonth + 1) / 5)
  759.     $iJulianDate = $i_cFactor + $iDay + $i_eFactor + $i_fFactor - 1524.5
  760.     return ($iJulianDate)
  761. EndFunc   ;==>_DateToDayValue
  762.  
  763. ;===============================================================================
  764. ;
  765. ; Description:      Returns the DayofWeek number for a given Date.  1=Sunday
  766. ; Parameter(s):     $Year
  767. ;                   $Month
  768. ;                   $day
  769. ; Requirement(s):   None
  770. ; Return Value(s):  On Success - Returns Day of the Week Range is 1 to 7 where 1=Sunday.
  771. ;                   On Failure - 0 and sets @ERROR = 1
  772. ; Author(s):        Jos van der Zande <jdeb at autoitscript dot com>
  773. ; Note(s):          None
  774. ;
  775. ;===============================================================================
  776. Func _DateToDayOfWeek($iYear, $iMonth, $iDay)
  777.     Local $i_aFactor
  778.     Local $i_yFactor
  779.     Local $i_mFactor
  780.     Local $i_dFactor
  781.     ; Verify If InputDate is valid
  782.     If Not _DateIsValid($iYear & "/" & $iMonth & "/" & $iDay) Then
  783.         SetError(1)
  784.         Return ("")
  785.     EndIf
  786.     $i_aFactor = Int((14 - $iMonth) / 12)
  787.     $i_yFactor = $iYear - $i_aFactor
  788.     $i_mFactor = $iMonth + (12 * $i_aFactor) - 2
  789.     $i_dFactor = Mod($iDay + $i_yFactor + Int($i_yFactor / 4) - Int($i_yFactor / 100) + Int($i_yFactor / 400) + Int((31 * $i_mFactor) / 12), 7)
  790.     return ($i_dFactor + 1)
  791. EndFunc   ;==>_DateToDayOfWeek
  792.  
  793. ;===============================================================================
  794. ;
  795. ; Description:      Returns the DayofWeek number for a given Date.  0=Monday 6=Sunday
  796. ; Parameter(s):     $Year
  797. ;                   $Month
  798. ;                   $day
  799. ; Requirement(s):   None
  800. ; Return Value(s):  On Success - Returns Day of the Week Range is 0 to 6 where 0=Monday.
  801. ;                   On Failure - 0 and sets @ERROR = 1
  802. ; Author(s):        Jos van der Zande <jdeb at autoitscript dot com>
  803. ; Note(s):          None
  804. ;
  805. ;===============================================================================
  806. Func _DateToDayOfWeekISO($iYear, $iMonth, $iDay)
  807.     Local $idow = _DateToDayOfWeek($iYear, $iMonth, $iDay)
  808.     If @error Then
  809.         SetError(1)
  810.         Return ""
  811.     EndIf
  812.     If $idow >= 2 Then Return $idow - 2
  813.     Return 6
  814. EndFunc   ;==>_DateToDayOfWeekISO
  815.  
  816. ;===============================================================================
  817. ;
  818. ; Description:      Add the given days since noon 4713 BC January 1 and return the date.
  819. ; Parameter(s):     $iJulianDate    - Julian date number
  820. ;                   $Year  - Year in format YYYY
  821. ;                   $Month - Month in format MM
  822. ;                   $sDate - Day of the month format DD
  823. ; Requirement(s):   None
  824. ; Return Value(s):  On Success - Returns the Date in the parameter vars
  825. ;                   On Failure - 0  and sets @ERROR = 1
  826. ; Author(s):        Jos van der Zande
  827. ; Note(s):          None
  828. ;
  829. ;===============================================================================
  830. Func _DayValueToDate($iJulianDate, ByRef $iYear, ByRef $iMonth, ByRef $iDay)
  831.     Local $i_zFactor
  832.     Local $i_wFactor
  833.     Local $i_aFactor
  834.     Local $i_bFactor
  835.     Local $i_xFactor
  836.     Local $i_cFactor
  837.     Local $i_dFactor
  838.     Local $i_eFactor
  839.     Local $i_fFactor
  840.     ; check for valid input date
  841.     If $iJulianDate < 0 Or Not IsNumber($iJulianDate) Then
  842.         SetError(1)
  843.         Return 0
  844.     EndIf
  845.     ; calculte the date
  846.     $i_zFactor = Int($iJulianDate + 0.5)
  847.     $i_wFactor = Int(($i_zFactor - 1867216.25) / 36524.25)
  848.     $i_xFactor = Int($i_wFactor / 4)
  849.     $i_aFactor = $i_zFactor + 1 + $i_wFactor - $i_xFactor
  850.     $i_bFactor = $i_aFactor + 1524
  851.     $i_cFactor = Int(($i_bFactor - 122.1) / 365.25)
  852.     $i_dFactor = Int(365.25 * $i_cFactor)
  853.     $i_eFactor = Int(($i_bFactor - $i_dFactor) / 30.6001)
  854.     $i_fFactor = Int(30.6001 * $i_eFactor)
  855.     $iDay = $i_bFactor - $i_dFactor - $i_fFactor
  856.     ; (must get number less than or equal to 12)
  857.     If $i_eFactor - 1 < 13 Then
  858.         $iMonth = $i_eFactor - 1
  859.     Else
  860.         $iMonth = $i_eFactor - 13
  861.     EndIf
  862.     If $iMonth < 3 Then
  863.         $iYear = $i_cFactor - 4715    ; (if Month is January or February)
  864.     Else
  865.         $iYear = $i_cFactor - 4716    ;(otherwise)
  866.     EndIf
  867.     $iYear = StringFormat( "%04d", $iYear)
  868.     $iMonth = StringFormat( "%02d", $iMonth)
  869.     $iDay = StringFormat( "%02d", $iDay)
  870.     Return $iYear & "/" & $iMonth & "/" & $iDay
  871. EndFunc   ;==>_DayValueToDate
  872.  
  873. ;===============================================================================
  874. ;
  875. ; Description:      Returns the date in the PC's regional settings format.
  876. ; Parameter(s):     $date - format "YYYY/MM/DD"
  877. ;                   $sType - :
  878. ;                      0 - Display a date and/or time. If there is a date part, display it as a short date.
  879. ;                          If there is a time part, display it as a long time. If present, both parts are displayed.
  880. ;                      1 - Display a date using the long date format specified in your computer's regional settings.
  881. ;                      2 - Display a date using the short date format specified in your computer's regional settings.
  882. ;                      3 - Display a time using the time format specified in your computer's regional settings.
  883. ;                      4 - Display a time using the 24-hour format (hh:mm).
  884. ; Requirement(s):   None
  885. ; Return Value(s):  On Success - Returns date in proper format
  886. ;                   On Failure - 0  and Set
  887. ;                                   @ERROR to:  1 - Invalid $sDate
  888. ;                                               2 - Invalid $sType
  889. ; Author(s):        Jos van der Zande <jdeb at autoitscript dot com>
  890. ; Note(s):          None...
  891. ;
  892. ;===============================================================================
  893. Func _DateTimeFormat($sDate, $sType)
  894.     Local $asDatePart[4]
  895.     Local $asTimePart[4]
  896.     Local $sTempDate = ""
  897.     Local $sTempTime = ""
  898.     Local $sAM
  899.     Local $sPM
  900.     Local $iWday
  901.     Local $lngX
  902.     ; Verify If InputDate is valid
  903.     If Not _DateIsValid($sDate) Then
  904.         SetError(1)
  905.         Return ("")
  906.     EndIf
  907.     ; input validation
  908.     If $sType < 0 Or $sType > 5 Or Not IsInt($sType) Then
  909.         SetError(2)
  910.         Return ("")
  911.     EndIf
  912.     ; split the date and time into arrays
  913.     _DateTimeSplit($sDate, $asDatePart, $asTimePart)
  914.     ;
  915.     ;     Const $LOCALE_USER_DEFAULT = 0x400
  916.     ;   Const $LOCALE_SDATE = 0x1D            ;  date separator
  917.     ;   Const $LOCALE_STIME = 0x1E            ;  time separator
  918.     ;   Const $LOCALE_S1159 = 0x28            ;  AM designator
  919.     ;   Const $LOCALE_S2359 = 0x29            ;  PM designator
  920.     ;     Const $LOCALE_SSHORTDATE = 0x1F       ;  short date format string
  921.     ;     Const $LOCALE_SLONGDATE = 0x20        ;  long date format string
  922.     ;     Const $LOCALE_STIMEFORMAT = 0x1003    ;  time format string
  923.     
  924.     Switch $sType
  925.         Case 0
  926.             ; Get ShortDate format
  927.             $lngX = DllCall("kernel32.dll", "long", "GetLocaleInfo", "long", 0x400, "long", 0x1F, "str", "", "long", 255)
  928.             If Not @error And $lngX[0] <> 0 Then
  929.                 $sTempDate = $lngX[3]
  930.             Else
  931.                 $sTempDate = "M/d/yyyy"
  932.             EndIf
  933.             ;
  934.             ; Get Time format
  935.             If $asTimePart[0] > 1 Then
  936.                 $lngX = DllCall("kernel32.dll", "long", "GetLocaleInfo", "long", 0x400, "long", 0x1003, "str", "", "long", 255)
  937.                 If Not @error And $lngX[0] <> 0 Then
  938.                     $sTempTime = $lngX[3]
  939.                 Else
  940.                     $sTempTime = "h:mm:ss tt"
  941.                 EndIf
  942.             EndIf
  943.         Case 1
  944.             ; Get LongDate format
  945.             $lngX = DllCall("kernel32.dll", "long", "GetLocaleInfo", "long", 0x400, "long", 0x20, "str", "", "long", 255)
  946.             If Not @error And $lngX[0] <> 0 Then
  947.                 $sTempDate = $lngX[3]
  948.             Else
  949.                 $sTempDate = "dddd, MMMM dd, yyyy"
  950.             EndIf
  951.         Case 2
  952.             ; Get ShortDate format
  953.             $lngX = DllCall("kernel32.dll", "long", "GetLocaleInfo", "long", 0x400, "long", 0x1F, "str", "", "long", 255)
  954.             If Not @error And $lngX[0] <> 0 Then
  955.                 $sTempDate = $lngX[3]
  956.             Else
  957.                 $sTempDate = "M/d/yyyy"
  958.             EndIf
  959.         Case 3
  960.             ;
  961.             ; Get Time format
  962.             If $asTimePart[0] > 1 Then
  963.                 $lngX = DllCall("kernel32.dll", "long", "GetLocaleInfo", "long", 0x400, "long", 0x1003, "str", "", "long", 255)
  964.                 If Not @error And $lngX[0] <> 0 Then
  965.                     $sTempTime = $lngX[3]
  966.                 Else
  967.                     $sTempTime = "h:mm:ss tt"
  968.                 EndIf
  969.             EndIf
  970.         Case 4
  971.             If $asTimePart[0] > 1 Then
  972.                 $sTempTime = "hh:mm"
  973.             EndIf
  974.         Case 5
  975.             If $asTimePart[0] > 1 Then
  976.                 $sTempTime = "hh:mm:ss"
  977.             EndIf
  978.     EndSwitch
  979.     ; Format DATE
  980.     If $sTempDate <> "" Then
  981.         ;   Const $LOCALE_SDATE = 0x1D            ;  date separator
  982.         $lngX = DllCall("kernel32.dll", "long", "GetLocaleInfo", "long", 0x400, "long", 0x1D, "str", "", "long", 255)
  983.         If Not @error And $lngX[0] <> 0 Then
  984.             $sTempTime = StringReplace($sTempTime, "/", $lngX[3])
  985.         EndIf
  986.         $iWday = _DateToDayOfWeek($asDatePart[1], $asDatePart[2], $asDatePart[3])
  987.         $asDatePart[3] = StringRight("0" & $asDatePart[3], 2) ; make sure the length is 2
  988.         $asDatePart[2] = StringRight("0" & $asDatePart[2], 2) ; make sure the length is 2
  989.         $sTempDate = StringReplace($sTempDate, "d", "@")
  990.         $sTempDate = StringReplace($sTempDate, "m", "#")
  991.         $sTempDate = StringReplace($sTempDate, "y", "&")
  992.         $sTempDate = StringReplace($sTempDate, "@@@@", _DateDayOfWeek($iWday, 0))
  993.         $sTempDate = StringReplace($sTempDate, "@@@", _DateDayOfWeek($iWday, 1))
  994.         $sTempDate = StringReplace($sTempDate, "@@", $asDatePart[3])
  995.         $sTempDate = StringReplace($sTempDate, "@", StringReplace(StringLeft($asDatePart[3], 1), "0", "") & StringRight($asDatePart[3], 1))
  996.         $sTempDate = StringReplace($sTempDate, "####", _DateMonthOfYear($asDatePart[2], 0))
  997.         $sTempDate = StringReplace($sTempDate, "###", _DateMonthOfYear($asDatePart[2], 1))
  998.         $sTempDate = StringReplace($sTempDate, "##", $asDatePart[2])
  999.         $sTempDate = StringReplace($sTempDate, "#", StringReplace(StringLeft($asDatePart[2], 1), "0", "") & StringRight($asDatePart[2], 1))
  1000.         $sTempDate = StringReplace($sTempDate, "&&&&", $asDatePart[1])
  1001.         $sTempDate = StringReplace($sTempDate, "&&", StringRight($asDatePart[1], 2))
  1002.     EndIf
  1003.     ; Format TIME
  1004.     If $sTempTime <> "" Then
  1005.         $lngX = DllCall("kernel32.dll", "long", "GetLocaleInfo", "long", 0x400, "long", 0x28, "str", "", "long", 255)
  1006.         If Not @error And $lngX[0] <> 0 Then
  1007.             $sAM = $lngX[3]
  1008.         Else
  1009.             $sAM = "AM"
  1010.         EndIf
  1011.         $lngX = DllCall("kernel32.dll", "long", "GetLocaleInfo", "long", 0x400, "long", 0x29, "str", "", "long", 255)
  1012.         If Not @error And $lngX[0] <> 0 Then
  1013.             $sPM = $lngX[3]
  1014.         Else
  1015.             $sPM = "PM"
  1016.         EndIf
  1017.         ;   Const $LOCALE_STIME = 0x1E            ;  time separator
  1018.         $lngX = DllCall("kernel32.dll", "long", "GetLocaleInfo", "long", 0x400, "long", 0x1E, "str", "", "long", 255)
  1019.         If Not @error And $lngX[0] <> 0 Then
  1020.             $sTempTime = StringReplace($sTempTime, ":", $lngX[3])
  1021.         EndIf
  1022.         If StringInStr($sTempTime, "tt") Then
  1023.             If $asTimePart[1] < 12 Then
  1024.                 $sTempTime = StringReplace($sTempTime, "tt", $sAM)
  1025.                 If $asTimePart[1] = 0 Then $asTimePart[1] = 12
  1026.             Else
  1027.                 $sTempTime = StringReplace($sTempTime, "tt", $sPM)
  1028.                 If $asTimePart[1] > 12 Then $asTimePart[1] = $asTimePart[1] - 12
  1029.             EndIf
  1030.         EndIf
  1031.         $asTimePart[1] = StringRight("0" & $asTimePart[1], 2) ; make sure the length is 2
  1032.         $asTimePart[2] = StringRight("0" & $asTimePart[2], 2) ; make sure the length is 2
  1033.         $asTimePart[3] = StringRight("0" & $asTimePart[3], 2) ; make sure the length is 2
  1034.         $sTempTime = StringReplace($sTempTime, "hh", StringFormat( "%02d", $asTimePart[1]))
  1035.         $sTempTime = StringReplace($sTempTime, "h", StringReplace(StringLeft($asTimePart[1], 1), "0", "") & StringRight($asTimePart[1], 1))
  1036.         $sTempTime = StringReplace($sTempTime, "mm", StringFormat( "%02d", $asTimePart[2]))
  1037.         $sTempTime = StringReplace($sTempTime, "ss", StringFormat( "%02d", $asTimePart[3]))
  1038.         $sTempDate = StringStripWS($sTempDate & " " & $sTempTime, 3)
  1039.     EndIf
  1040.     Return ($sTempDate)
  1041. EndFunc   ;==>_DateTimeFormat
  1042.  
  1043. ;===============================================================================
  1044. ;
  1045. ; Description:      Returns the the julian date in format YYDDD
  1046. ; Parameter(s):     $iJulianDate    - Julian date number
  1047. ;                   $Year  - Year in format YYYY
  1048. ;                   $Month - Month in format MM
  1049. ;                   $sDate - Day of the month format DD
  1050. ; Requirement(s):   None
  1051. ; Return Value(s):  On Success - Returns the Date in the parameter vars
  1052. ;                   On Failure - 0  and sets @ERROR = 1
  1053. ; Author(s):        Jeremy Landes / Jos van der Zande
  1054. ; Note(s):          None
  1055. ;
  1056. ;===============================================================================
  1057. Func _DateJulianDayNo($iYear, $iMonth, $iDay)
  1058.     Local $sFullDate
  1059.     Local $aiDaysInMonth
  1060.     Local $iJDay
  1061.     Local $iCntr
  1062.     ; Verify If InputDate is valid
  1063.     $sFullDate = StringFormat( "%04d/%02d/%02d", $iYear, $iMonth, $iDay)
  1064.     If Not _DateIsValid($sFullDate) Then
  1065.         SetError(1)
  1066.         Return ""
  1067.     EndIf
  1068.     ; Build JDay value
  1069.     $iJDay = 0
  1070.     $aiDaysInMonth = __DaysInMonth($iYear)
  1071.     For $iCntr = 1 To $iMonth - 1
  1072.         $iJDay = $iJDay + $aiDaysInMonth[$iCntr]
  1073.     Next
  1074.     $iJDay = ($iYear * 1000) + ($iJDay + $iDay)
  1075.     Return $iJDay
  1076. EndFunc   ;==>_DateJulianDayNo
  1077.  
  1078. ;===============================================================================
  1079. ;
  1080. ; Description:      Returns the date for a julian date in format YYDDD
  1081. ; Parameter(s):     $iJDate  - Julian date number
  1082. ; Requirement(s):   None
  1083. ; Return Value(s):  On Success - Returns the Date in format YYYY/MM/DD
  1084. ;                   On Failure - 0  and sets @ERROR = 1
  1085. ; Author(s):        Jeremy Landes / Jos van der Zande
  1086. ; Note(s):          None
  1087. ;
  1088. ;===============================================================================
  1089. Func _JulianToDate($iJDay)
  1090.     Local $aiDaysInMonth
  1091.     Local $iYear
  1092.     Local $iMonth
  1093.     Local $iDay
  1094.     Local $iDays
  1095.     Local $iMaxDays
  1096.     Local $sSep = "/"
  1097.     ; Verify If InputDate is valid
  1098.     $iYear = Int($iJDay / 1000)
  1099.     $iDays = Mod($iJDay, 1000)
  1100.     $iMaxDays = 365
  1101.     If _DateIsLeapYear($iYear) Then $iMaxDays = 366
  1102.     If $iDays > $iMaxDays Then
  1103.         SetError(1)
  1104.         Return ""
  1105.     EndIf
  1106.     ; Convert to regular date
  1107.     $aiDaysInMonth = __DaysInMonth($iYear)
  1108.     $iMonth = 1
  1109.     While $iDays > $aiDaysInMonth[ $iMonth ]
  1110.         $iDays = $iDays - $aiDaysInMonth[ $iMonth ]
  1111.         $iMonth = $iMonth + 1
  1112.     WEnd
  1113.     $iDay = $iDays
  1114.     Return StringFormat( "%04d%s%02d%s%02d", $iYear, $sSep, $iMonth, $sSep, $iDay)
  1115. EndFunc   ;==>_JulianToDate
  1116.  
  1117. ;===============================================================================
  1118. ;
  1119. ; Description:      Returns the current Date and Time in the pc's format
  1120. ; Parameter(s):     None
  1121. ; Requirement(s):   None
  1122. ; Return Value(s):  On Success - Date in pc's format
  1123. ; Author(s):        Jos van der Zande
  1124. ; Note(s):          None
  1125. ;
  1126. ;===============================================================================
  1127. Func _Now()
  1128.     Return (_DateTimeFormat(@YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC, 0))
  1129. EndFunc   ;==>_Now
  1130.  
  1131. ;===============================================================================
  1132. ;
  1133. ; Description:      Returns the current Date and Time in format YYYY/MM/DD HH:MM:SS
  1134. ; Parameter(s):     None
  1135. ; Requirement(s):   None
  1136. ; Return Value(s):  On Success - Date in in format YYYY/MM/DD HH:MM:SS
  1137. ; Author(s):        Jos van der Zande
  1138. ; Note(s):          None
  1139. ;
  1140. ;===============================================================================
  1141. Func _NowCalc()
  1142.     Return (@YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC)
  1143. EndFunc   ;==>_NowCalc
  1144. ;===============================================================================
  1145. ;
  1146. ; Description:      Returns the current Date in format YYYY/MM/DD
  1147. ; Parameter(s):     None
  1148. ; Requirement(s):   None
  1149. ; Return Value(s):  On Success - Date in in format YYYY/MM/DD
  1150. ; Author(s):        Jos van der Zande
  1151. ; Note(s):          None
  1152. ;
  1153. ;===============================================================================
  1154. Func _NowCalcDate()
  1155.     Return (@YEAR & "/" & @MON & "/" & @MDAY)
  1156. EndFunc   ;==>_NowCalcDate
  1157.  
  1158. ;===============================================================================
  1159. ;
  1160. ; Description:      Returns the current Date in the pc's format
  1161. ; Parameter(s):     None
  1162. ; Requirement(s):   None
  1163. ; Return Value(s):  On Success - Date in pc's format
  1164. ; Author(s):        Jos van der Zande (Larry's idea)
  1165. ; Note(s):          None
  1166. ;
  1167. ;===============================================================================
  1168. Func _NowDate()
  1169.     Return (_DateTimeFormat(@YEAR & "/" & @MON & "/" & @MDAY, 0))
  1170. EndFunc   ;==>_NowDate
  1171.  
  1172. ;===============================================================================
  1173. ;
  1174. ; Description:      Returns the current Date and Time in the pc's format
  1175. ; Parameter(s):     None
  1176. ; Requirement(s):   None
  1177. ; Return Value(s):  On Success - Date in pc's format
  1178. ; Author(s):        Jos van der Zande
  1179. ; Note(s):          None
  1180. ;
  1181. ;===============================================================================
  1182. Func _NowTime($sType = 3)
  1183.     If $sType < 3 Or $sType > 5 Then $sType = 3
  1184.     Return (_DateTimeFormat(@YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC, $sType))
  1185. EndFunc   ;==>_NowTime
  1186.  
  1187. ;===============================================================================
  1188. ;
  1189. ; Description:      Sets the local date of the system / computer
  1190. ; Parameter(s):     $iDay     - Day of month Values: 1-31
  1191. ;                   $iMonth - Moth Values: 1-12
  1192. ;                   $iYear (optional)  - Year Values: > 0 (windows might restrict this further!!)
  1193. ;
  1194. ; Requirement(s):   DllCall
  1195. ; Return Value(s):  On Success - 1
  1196. ;                   On Failure - 0 sets @ERROR = 1 and @EXTENDED (Windows API error code)
  1197. ;
  1198. ; Error code(s):     http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp
  1199. ;
  1200. ; Author(s):        /dev/null
  1201. ; Note(s):          -
  1202. ;
  1203. ;===============================================================================
  1204. Func _SetDate($iDay, $iMonth = 0, $iYear = 0)
  1205.     
  1206.     Local $iRetval, $SYSTEMTIME, $lpSystemTime
  1207.     
  1208.     ;============================================================================
  1209.     ;== Some error checking
  1210.     ;============================================================================
  1211.     If $iYear = 0 Then $iYear = @YEAR
  1212.     If $iMonth = 0 Then $iMonth = @MON
  1213.     If Not _DateIsValid($iYear & "/" & $iMonth & "/" & $iDay) Then Return 1
  1214.     
  1215.     $SYSTEMTIME = DllStructCreate("ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort")
  1216.     $lpSystemTime = DllStructGetPtr($SYSTEMTIME)
  1217.     
  1218.     ;============================================================================
  1219.     ;== Get the local system time to fill up the SYSTEMTIME structure
  1220.     ;============================================================================
  1221.     $iRetval = DllCall("kernel32.dll", "long", "GetLocalTime", "ptr", $lpSystemTime)
  1222.     
  1223.     ;============================================================================
  1224.     ;== Change the necessary values
  1225.     ;============================================================================
  1226.     DllStructSetData($SYSTEMTIME, 4, $iDay)
  1227.     If $iMonth > 0 Then DllStructSetData($SYSTEMTIME, 2, $iMonth)
  1228.     If $iYear > 0 Then DllStructSetData($SYSTEMTIME, 1, $iYear)
  1229.     
  1230.     ;============================================================================
  1231.     ;== Set the new date
  1232.     ;============================================================================
  1233.     $iRetval = DllCall("kernel32.dll", "long", "SetLocalTime", "ptr", $lpSystemTime)
  1234.     
  1235.     ;============================================================================
  1236.     ;== If DllCall was successfull, check for an error of the API Call
  1237.     ;============================================================================
  1238.     If @error = 0 Then
  1239.         If $iRetval[0] = 0 Then
  1240.             Local $lastError = DllCall("kernel32.dll", "int", "GetLastError")
  1241.             SetExtended($lastError[0])
  1242.             SetError(1)
  1243.             Return 0
  1244.         Else
  1245.             Return 1
  1246.         EndIf
  1247.         ;============================================================================
  1248.         ;== If DllCall was UNsuccessfull, return an error
  1249.         ;============================================================================
  1250.     Else
  1251.         SetError(1)
  1252.         Return 0
  1253.     EndIf
  1254.     
  1255. EndFunc   ;==>_SetDate
  1256.  
  1257. ;===============================================================================
  1258. ;
  1259. ; Description:      Sets the local time of the system / computer
  1260. ; Parameter(s):     $iHour     - hour Values: 0-23
  1261. ;                   $iMinute - minute Values: 0-59
  1262. ;                   $iSecond (optional)  - second Values: 0-59
  1263. ;
  1264. ; Requirement(s):   DllCall
  1265. ; Return Value(s):  On Success - 1
  1266. ;                   On Failure - 0 sets @ERROR = 1 and @EXTENDED (Windows API error code)
  1267. ;
  1268. ; Error code(s):     http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp
  1269. ;
  1270. ; Author(s):        /dev/null
  1271. ; Note(s):          -
  1272. ;
  1273. ;===============================================================================
  1274. Func _SetTime($iHour, $iMinute, $iSecond = 0)
  1275.     
  1276.     Local $iRetval, $SYSTEMTIME, $lpSystemTime
  1277.     
  1278.     ;============================================================================
  1279.     ;== Some error checking
  1280.     ;============================================================================
  1281.     If $iHour < 0 Or $iHour > 23 Then Return 1
  1282.     If $iMinute < 0 Or $iMinute > 59 Then Return 1
  1283.     If $iSecond < 0 Or $iSecond > 59 Then Return 1
  1284.     
  1285.     $SYSTEMTIME = DllStructCreate("ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort")
  1286.     $lpSystemTime = DllStructGetPtr($SYSTEMTIME)
  1287.     
  1288.     ;============================================================================
  1289.     ;== Get the local system time to fill up the SYSTEMTIME structure
  1290.     ;============================================================================
  1291.     $iRetval = DllCall("kernel32.dll", "long", "GetLocalTime", "ptr", $lpSystemTime)
  1292.     
  1293.     ;============================================================================
  1294.     ;== Change the necessary values
  1295.     ;============================================================================
  1296.     DllStructSetData($SYSTEMTIME, 5, $iHour)
  1297.     DllStructSetData($SYSTEMTIME, 6, $iMinute)
  1298.     If $iSecond > 0 Then DllStructSetData($SYSTEMTIME, 7, $iSecond)
  1299.     
  1300.     ;============================================================================
  1301.     ;== Set the new time
  1302.     ;============================================================================
  1303.     $iRetval = DllCall("kernel32.dll", "long", "SetLocalTime", "ptr", $lpSystemTime)
  1304.     
  1305.     ;============================================================================
  1306.     ;== If DllCall was successfull, check for an error of the API Call
  1307.     ;============================================================================
  1308.     If @error = 0 Then
  1309.         If $iRetval[0] = 0 Then
  1310.             Local $lastError = DllCall("kernel32.dll", "int", "GetLastError")
  1311.             SetExtended($lastError[0])
  1312.             SetError(1)
  1313.             Return 0
  1314.         Else
  1315.             Return 1
  1316.         EndIf
  1317.         ;============================================================================
  1318.         ;== If DllCall was UNsuccessfull, return an error
  1319.         ;============================================================================
  1320.     Else
  1321.         SetError(1)
  1322.         Return 0
  1323.     EndIf
  1324.     
  1325. EndFunc   ;==>_SetTime
  1326.  
  1327. ;===============================================================================
  1328. ;
  1329. ; Description:      Converts the specified tick amount to hours, minutes, and
  1330. ;                   seconds.
  1331. ; Parameter(s):     $iTicks - Tick amount
  1332. ;                   $iHours - Variable to store the hours (ByRef)
  1333. ;                   $iMins  - Variable to store the minutes (ByRef)
  1334. ;                   $iSecs  - Variable to store the seconds (ByRef)
  1335. ; Requirement(s):   None
  1336. ; Return Value(s):  On Success - 1
  1337. ;                   On Failure - 0 and sets @ERROR = 1
  1338. ; Author(s):        Marc <mrd at gmx de>
  1339. ; Note(s):          None
  1340. ;
  1341. ;===============================================================================
  1342. Func _TicksToTime($iTicks, ByRef $iHours, ByRef $iMins, ByRef $iSecs)
  1343.     If Number($iTicks) > 0 Then
  1344.         $iTicks = Round($iTicks / 1000)
  1345.         $iHours = Int($iTicks / 3600)
  1346.         $iTicks = Mod($iTicks, 3600)
  1347.         $iMins = Int($iTicks / 60)
  1348.         $iSecs = Round(Mod($iTicks, 60))
  1349.         ; If $iHours = 0 then $iHours = 24
  1350.         Return 1
  1351.     Else
  1352.         SetError(1)
  1353.         Return 0
  1354.     EndIf
  1355. EndFunc   ;==>_TicksToTime
  1356.  
  1357. ;===============================================================================
  1358. ;
  1359. ; Description:      Converts the specified hours, minutes, and seconds to ticks.
  1360. ; Parameter(s):     $iHours - Hours
  1361. ;                   $iMins  - Minutes
  1362. ;                   $iSecs  - Seconds
  1363. ; Requirement(s):   None
  1364. ; Return Value(s):  On Success - Converted tick amount
  1365. ;                   On Failure - 0 and sets @ERROR = 1
  1366. ; Author(s):        Marc <mrd at gmx de>
  1367. ;                   SlimShady: added the default time and made parameters optional
  1368. ; Note(s):          None
  1369. ;
  1370. ;===============================================================================
  1371. Func _TimeToTicks($iHours = @HOUR, $iMins = @MIN, $iSecs = @SEC)
  1372.     ;==============================================
  1373.     ; Local Constant/Variable Declaration Section
  1374.     ;==============================================
  1375.     Local $iTicks
  1376.     
  1377.     If StringIsInt($iHours) And StringIsInt($iMins) And StringIsInt($iSecs) Then
  1378.         $iTicks = 1000 * ((3600 * $iHours) + (60 * $iMins) + $iSecs)
  1379.         Return $iTicks
  1380.     Else
  1381.         SetError(1)
  1382.         Return 0
  1383.     EndIf
  1384. EndFunc   ;==>_TimeToTicks
  1385.  
  1386. ;===============================================================================
  1387. ;
  1388. ; Function Name:    _WeekNumberISO()
  1389. ; Description:      Find out the week number of current date OR date given in parameters
  1390. ;
  1391. ; Parameter(s):     $iDay    - Day value (default = current day)
  1392. ;                   $iMonth    - Month value (default = current month)
  1393. ;                   $iYear    - Year value (default = current year)
  1394. ; Requirement(s):
  1395. ; Return Value(s):  On Success     - Returns week number of given date
  1396. ;                   On Failure     - returns -1  and sets @ERROR = 1 on faulty parameters values
  1397. ;                   On non-acceptable weekstart value sets @ERROR = 99 and uses default (Sunday) as starting day
  1398. ; Author(s):        Tuape
  1399. ;                   JdeB: modified to UDF standards & Doc.
  1400. ;                   JdeB: Change calculation logic.
  1401. ;===============================================================================
  1402. ;
  1403. Func _WeekNumberISO($iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY)
  1404.     Local $idow, $iDow0101
  1405.     
  1406.     ; Check for erroneous input in $Day, $Month & $Year
  1407.     If $iDay > 31 Or $iDay < 1 Then
  1408.         SetError(1)
  1409.         Return -1
  1410.     ElseIf $iMonth > 12 Or $iMonth < 1 Then
  1411.         SetError(1)
  1412.         Return -1
  1413.     ElseIf $iYear < 1 Or $iYear > 2999 Then
  1414.         SetError(1)
  1415.         Return -1
  1416.     EndIf
  1417.     
  1418.     $idow = _DateToDayOfWeekISO($iYear, $iMonth, $iDay);
  1419.     $iDow0101 = _DateToDayOfWeekISO($iYear, 1, 1);
  1420.     
  1421.     if ($iMonth = 1 And 3 < $iDow0101 And $iDow0101 < 7 - ($iDay - 1)) Then
  1422.         ;days before week 1 of the current year have the same week number as
  1423.         ;the last day of the last week of the previous year
  1424.         $idow = $iDow0101 - 1;
  1425.         $iDow0101 = _DateToDayOfWeekISO($iYear - 1, 1, 1);
  1426.         $iMonth = 12
  1427.         $iDay = 31
  1428.         $iYear = $iYear - 1
  1429.     ElseIf ($iMonth = 12 And 30 - ($iDay - 1) < _DateToDayOfWeekISO($iYear + 1, 1, 1) And _DateToDayOfWeekISO($iYear + 1, 1, 1) < 4) Then
  1430.         ; days after the last week of the current year have the same week number as
  1431.         ; the first day of the next year, (i.e. 1)
  1432.         Return 1;
  1433.     EndIf
  1434.     
  1435.     Return Int((_DateToDayOfWeekISO($iYear, 1, 1) < 4) + 4 * ($iMonth - 1) + (2 * ($iMonth - 1) + ($iDay - 1) + $iDow0101 - $idow + 6) * 36 / 256)
  1436.     
  1437. EndFunc   ;==>_WeekNumberISO
  1438.  
  1439.  
  1440. ;===============================================================================
  1441. ;
  1442. ; Function Name:    _WeekNumber()
  1443. ; Description:      Find out the week number of current date OR date given in parameters
  1444. ;
  1445. ; Parameter(s):     $iDay    - Day value (default = current day)
  1446. ;                   $iMonth    - Month value (default = current month)
  1447. ;                   $iYear    - Year value (default = current year)
  1448. ;                   $iWeekstart - Week starts from Sunday (1, default) or Monday (2)
  1449. ; Requirement(s):
  1450. ; Return Value(s):  On Success     - Returns week number of given date
  1451. ;                   On Failure     - returns -1  and sets @ERROR = 1 on faulty parameters values
  1452. ;                   On non-acceptable weekstart value sets @ERROR = 99 and uses default (Sunday) as starting day
  1453. ; Author(s):        JdeB
  1454. ;===============================================================================
  1455. ;
  1456. Func _WeekNumber($iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY, $iWeekStart = 1)
  1457.     Local $iDow0101, $iDow0101ny
  1458.     Local $iDate, $iStartWeek1, $iEndWeek1, $iEndWeek1Date, $iStartWeek1ny, $iStartWeek1Dateny
  1459.     Local $iCurrDateDiff, $iCurrDateDiffny
  1460.     
  1461.     ; Check for erroneous input in $Day, $Month & $Year
  1462.     If $iDay > 31 Or $iDay < 1 Then
  1463.         SetError(1)
  1464.         Return -1
  1465.     ElseIf $iMonth > 12 Or $iMonth < 1 Then
  1466.         SetError(1)
  1467.         Return -1
  1468.     ElseIf $iYear < 1 Or $iYear > 2999 Then
  1469.         SetError(1)
  1470.         Return -1
  1471.     ElseIf $iWeekStart < 1 Or $iWeekStart > 2 Then
  1472.         SetError(2)
  1473.         Return -1
  1474.     EndIf
  1475.     ;
  1476.     ;$idow = _DateToDayOfWeekISO($iYear, $iMonth, $iDay);
  1477.     $iDow0101 = _DateToDayOfWeekISO($iYear, 1, 1);
  1478.     $iDate = $iYear & '/' & $iMonth & '/' & $iDay
  1479.     ;Calculate the Start and End date of Week 1 this year
  1480.     If $iWeekStart = 1 Then
  1481.         If $iDow0101 = 6 Then
  1482.             $iStartWeek1 = 0
  1483.         Else
  1484.             $iStartWeek1 = -1 * $iDow0101 - 1
  1485.         EndIf
  1486.         $iEndWeek1 = $iStartWeek1 + 6
  1487.     Else
  1488.         $iStartWeek1 = $iDow0101 * - 1
  1489.         $iEndWeek1 = $iStartWeek1 + 6
  1490.     EndIf
  1491.     ;$iStartWeek1Date = _DateAdd('d',$iStartWeek1,$iYear & '/01/01')
  1492.     $iEndWeek1Date = _DateAdd('d', $iEndWeek1, $iYear & '/01/01')
  1493.     ;Calculate the Start and End date of Week 1 this Next year
  1494.     $iDow0101ny = _DateToDayOfWeekISO($iYear + 1, 1, 1);
  1495.     ;  1 = start on Sunday / 2 = start on Monday
  1496.     If $iWeekStart = 1 Then
  1497.         If $iDow0101ny = 6 Then
  1498.             $iStartWeek1ny = 0
  1499.         Else
  1500.             $iStartWeek1ny = -1 * $iDow0101ny - 1
  1501.         EndIf
  1502.         ;$IEndWeek1ny = $iStartWeek1ny + 6
  1503.     Else
  1504.         $iStartWeek1ny = $iDow0101ny * - 1
  1505.         ;$IEndWeek1ny = $iStartWeek1ny + 6
  1506.     EndIf
  1507.     $iStartWeek1Dateny = _DateAdd('d', $iStartWeek1ny, $iYear + 1 & '/01/01')
  1508.     ;$iEndWeek1Dateny = _DateAdd('d',$IEndWeek1ny,$iYear+1 & '/01/01')
  1509.     ;number of days after end week 1
  1510.     $iCurrDateDiff = _DateDiff('d', $iEndWeek1Date, $iDate) - 1
  1511.     ;number of days before next week 1 start
  1512.     $iCurrDateDiffny = _DateDiff('d', $iStartWeek1Dateny, $iDate)
  1513.     ;
  1514.     ; Check for end of year
  1515.     If $iCurrDateDiff >= 0 And $iCurrDateDiffny < 0 Then Return 2 + Int($iCurrDateDiff / 7)
  1516.     ; > week 1
  1517.     If $iCurrDateDiff < 0 Or $iCurrDateDiffny >= 0 Then Return 1
  1518. EndFunc   ;==>_WeekNumber
  1519.  
  1520.  
  1521. ;===============================================================================
  1522. ;
  1523. ; Description:      returns an Array that contains the numbers of days per month
  1524. ;                   te specified year
  1525. ; Parameter(s):     $iYear
  1526. ; Requirement(s):   None
  1527. ; Return Value(s):  On Success - Array that contains the numbers of days per month
  1528. ;                   On Failure - none
  1529. ; Author(s):        Jos van der Zande / Jeremy Landes
  1530. ; Note(s):          None
  1531. ;
  1532. ;===============================================================================
  1533. Func __DaysInMonth($iYear)
  1534.     Local $aiDays
  1535.     $aiDays = StringSplit("31,28,31,30,31,30,31,31,30,31,30,31", ",")
  1536.     If _DateIsLeapYear($iYear) Then $aiDays[2] = 29
  1537.     Return $aiDays
  1538. EndFunc   ;==>__DaysInMonth
  1539.  
  1540.